Interpreter based software differs from regular (e.g., compiled) executable programs that are converted (compiled, assembled and linked) from source code to machine-code instructions which can be run directly on a computer system. A program written in an interpreted program language (Java™ is an example of an interpreter-based language) is compiled from source code into an intermediate code which is intepreted by an interpreter (the Java™ byte-code interpreter is referred to as the Java™ virtual machine—Java™VM). The interpreter does not perform compilation of source code as a whole into machine-executable instructions. Rather, the interpreter retrieves instructions referenced by its instruction pointer and performs a line-by-line execution of the program, by interpreting one program statement (e.g., Java bytecode) at a time, executing it, and then proceeding to the next statement. Programs running in interpreters are inherently slower than compiled executables.
A debugger needs to be able to set a breakpoint in the target code. Debuggers are usually part of the development environment. Software breakpoints are typically an instruction (usually a special breakpoint opcode) inserted in the code at a desired breakpoint location. When properly implemented the debugger remembers the instruction that was at the breakpoint address, replacing it after the code hits any breakpoint.
With certain target execution environments, such as handheld devices, debugging of target code must be performed by loading the program on the device and then running the program within a debugger support module on the device. The debugger support module is normally integrated with the development environment and knows how to handle breakpoints set in the development environment, allowing a developer to add change and observe breakpoints while the program is running in debug mode on the target device. One of the limitations, is that the target program must be loaded into flash type memory on the device. Typically an individual bit stored in the programmed memory cell of a flash memory cannot, be changed from the programmed state back to an un-programmed state without erasing all the bits of a section (e.g. page, block, entire memory chip) of the memory cells. Accordingly if new breakpoints are inserted; the flash memory sometimes has to be completely erased and rewritten with the new breakpoint or existing breakpoints may not be conveniently and selectively erased without erasing the target program and rewriting it to flash without the breakpoint.
Accordingly there is need for a system and method for implementing software breakpoints which allows for more efficient setting and clearing of breakpoints and which has minimal impact on the target code being debugged.